package com.zh.test.Steam;

import com.zh.test.lamdba.lamdbaInterface;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * @Author zh
 * @Description  方法定义只有两种:有返回值/无返回值   测试stream 的map 与peek的区别
 * map中需要的是Function接口,接口实现类有返回值,
 * peek中需要的是Consumer接口,接口实现类需要的是void的
 *  类::的用法 ,是直接将方法名字作为参数,stream中的所有元素,依次调用指定的方法 ,如果用map,被调用的方法需要返回值,如果用peek,调用的方法void
 *  map里面能使用::语法,是因为 map(Function)  Person.returnSelf()相当于Function的accept的实现,accept方法只有一个参数,所以他实现方法returnSelf()也只能有一个方法
 *  因为map接受的是stream中元素实例,所以map中::方法相当于实例方法,不需要静态方法
 * @Date 2020/4/29
 * @Param
 * @return
 **/
public class StreamTest2 {
    public static void main(String[] args) {
        List<Person> PList = Arrays.asList(new Person("a", "a", "a", 1), new Person("b", "b", "b", 2), new Person("c", "c", "c", 3));
        List<String> IList = PList.stream().map(Person::getOne).collect(Collectors.toList());
        //PList.stream().peek(Person::show).collect(Collectors.toList()); // 此时stream中元素为  实例对象 ::方法必须是非静态的
        List<Person> collect = PList.stream().map(Person::returnSelf).collect(Collectors.toList());
        Consumer c = s->s = s.equals("");
        Function f = s->{ return s;};

        List<Person> pp = PList.stream().peek((p) -> {p.setPeek("peek不会破坏元素类型,只是对元素内容进行修改,只关注业务过程"); }).collect(Collectors.toList());// 此时stream中的元素为新元素,非对象, 需要静态方法
        List<Integer> collect1 = PList.stream().map(s -> s.getAge()).collect(Collectors.toList());



    }
}
